/*
内核定时器到期就不再触发回调，除非在回调中再次设定下次的到期时间

// 初始化定时器（新版本推荐）
void timer_setup(struct timer_list *timer, 
                 void (*function)(struct timer_list *),
                 unsigned int flags);

// 修改定时器到期时间
int mod_timer(struct timer_list *timer, unsigned long expires);

// 删除定时器
int del_timer(struct timer_list *timer);

// 同步删除定时器（保证在其他CPU上不会重新运行）
int del_timer_sync(struct timer_list *timer);

// 检查定时器是否正在等待执行
int timer_pending(const struct timer_list *timer);

// 从struct timer_list地址获取所属结构体的地址
#define from_timer(var, callback_timer, timer_fieldname) \
	container_of(callback_timer, typeof(*var), timer_fieldname)

// 常用时间转换
unsigned long timeout = jiffies + HZ;        // 1秒后
unsigned long timeout = jiffies + 5 * HZ;    // 5秒后
unsigned long timeout = jiffies + msecs_to_jiffies(500);  // 500毫秒后
unsigned long timeout = jiffies + usecs_to_jiffies(100000); // 100毫秒后
*/

#include "linux/init.h"
#include "linux/module.h"
#include <linux/timer.h>
#include <linux/jiffies.h>

static struct timer_list timer;

static void fun(struct timer_list *timer)
{
    printk("file=%s,fun=%s,line=%d\n", __FILE__, __FUNCTION__, __LINE__);

    unsigned long timeout = jiffies + 5 * HZ;    // 5秒后
    mod_timer(timer, timeout);
}

static int __init lxz_timer_init(void)
{
    printk("file=%s,fun=%s,line=%d\n", __FILE__, __FUNCTION__, __LINE__);

    timer_setup(&(timer), fun, 0);

    unsigned long timeout = jiffies + 5 * HZ;    // 5秒后
    mod_timer(&(timer), timeout);

    return 0;
}

static void __exit lxz_timer_exit(void)
{
    printk("file=%s,fun=%s,line=%d\n", __FILE__, __FUNCTION__, __LINE__);

    del_timer(&timer);
}

module_init(lxz_timer_init);
module_exit(lxz_timer_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lxz");
